"""
文件名：serializers.py
作者：教务系统开发团队
创建日期：2025-04-27
描述：用户认证模块的序列化器，处理用户数据的序列化和反序列化
"""
from rest_framework import serializers
from .models import Parent, ParentStudentRelationship
from students.models import Student

class ParentStudentRelationshipSerializer(serializers.ModelSerializer):
    """
    家长-学生关系序列化器
    
    功能：
        - 序列化家长与学生关系数据
        - 验证关联学生信息
    """
    student_id = serializers.CharField(write_only=True, required=True, help_text='学生学号')
    
    class Meta:
        model = ParentStudentRelationship
        fields = ['student_id', 'is_primary']
        extra_kwargs = {
            'is_primary': {'required': False, 'default': False}
        }
    
    def validate_student_id(self, value):
        """
        验证学生学号是否存在
        
        参数：
            value: 学生学号
        返回：
            学生实例
        异常：
            serializers.ValidationError: 当学生不存在时抛出
        """
        try:
            return Student.objects.get(student_id=value)
        except Student.DoesNotExist:
            raise serializers.ValidationError('该学号不存在')

class ParentSerializer(serializers.ModelSerializer):
    """
    家长用户序列化器
    
    功能：
        - 序列化家长基本信息
        - 处理家长关联学生操作
    """
    students = ParentStudentRelationshipSerializer(many=True, required=False)
    
    class Meta:
        model = Parent
        fields = ['id', 'username', 'name', 'gender', 'id_card', 'phone', 'students']
        extra_kwargs = {
            'username': {'required': True},
            'password': {'write_only': True}
        }
    
    def create(self, validated_data):
        """
        创建家长用户并关联学生
        
        参数：
            validated_data: 已验证的数据
        返回：
            创建的家长实例
        """
        students_data = validated_data.pop('students', [])
        parent = Parent.objects.create_user(**validated_data)
        
        for student_data in students_data:
            ParentStudentRelationship.objects.create(
                parent=parent,
                student=student_data['student_id'],
                is_primary=student_data.get('is_primary', False)
            )
        
        return parent
    
    def update(self, instance, validated_data):
        """
        更新家长信息并管理学生关联
        
        参数：
            instance: 家长实例
            validated_data: 已验证的数据
        返回：
            更新后的家长实例
        """
        students_data = validated_data.pop('students', None)
        
        # 更新基本信息
        for attr, value in validated_data.items():
            setattr(instance, attr, value)
        instance.save()
        
        # 处理学生关联
        if students_data is not None:
            # 清除现有关联
            instance.parentstudentrelationship_set.all().delete()
            
            # 添加新关联
            for student_data in students_data:
                ParentStudentRelationship.objects.create(
                    parent=instance,
                    student=student_data['student_id'],
                    is_primary=student_data.get('is_primary', False)
                )
        
        return instance